
import { allKeys } from '../core/allKeys'
import { each } from '../core/each'
import { isUndef } from '../core/isUndef'
/**
 * 11065
 * 复制多个对象中的所有属性到目标对象上,包括源对象原型链上的属性
 * extend({ name: 'RedHood' }, { age: 24 }); // -> {name: 'RedHood', age: 24}
 * dependencies: createAssigner allKeys
 * @param {*} target 
 * @param  {...any} source
 * @returns 
 */
export function extend (obj,...source) {
  
  //exports = createAssigner(allKeys);
  //return exports;

  var defaults = true;
  each(arguments, function (src, idx) {
    if (idx === 0) return;
    var keyArr = allKeys(src);
    each(keyArr, function (key) {
      if (!defaults || isUndef(obj[key])) {
        obj[key] = src[key];
      }
    });
  });
  return obj;
}


function inherit (Child, Parent) {
  // 继承原型上的属性 
  Child.prototype = Object.create(Parent.prototype)
  // 修复 constructor
  Child.prototype.constructor = Child
  // 存储超类
  Child.super = Parent
  // 静态属性继承
  if (Object.setPrototypeOf) {
    // setPrototypeOf es6
    Object.setPrototypeOf(Child, Parent)
  } else if (Child.__proto__) {
    // __proto__ es6 引入，但是部分浏览器早已支持
    Child.__proto__ = Parent
  } else {
    // 兼容 IE10 等陈旧浏览器
    // 将 Parent 上的静态属性和方法拷贝一份到 Child 上，不会覆盖 Child 上的方法
    for (var k in Parent) {
      if (Parent.hasOwnProperty(k) && !(k in Child)) {
        Child[k] = Parent[k]
      }
    }
  }
}

